package Item

import (
	codecs "sanguo/codec/cs"
	"sanguo/node/common/transaction"
	"sanguo/node/node_game"
	"sanguo/node/node_game/module/role"
	"sanguo/node/node_game/user"
	table_Item "sanguo/node/table/excel/table/Item"
	cs_message "sanguo/protocol/cs/message"
	"time"

	"github.com/golang/protobuf/proto"
)

type transactionUseItem struct {
	transaction.TransactionBase
	user    *user.User
	req     *codecs.Message
	resp    *cs_message.UseItemToC
	errcode cs_message.EnumType
}

func (this *transactionUseItem) GetModuleName() string {
	return "Item"
}

func (this *transactionUseItem) GetReplyMsg() proto.Message {
	return &cs_message.UseItemToC{}
}

func (this *transactionUseItem) SetExpiredTime(expired time.Time) {
	this.Expired = expired
}

func (this *transactionUseItem) GetExpiredTime() time.Time {
	return this.Expired
}

func (this *transactionUseItem) Begin() {

	this.resp = &cs_message.UseItemToC{}
	msg := this.req.GetData().(*cs_message.UseItemToS)
	roleModule := this.user.GetModuleByName("role").(*role.RoleModule)
	role := roleModule.CurrentRole()

	if role == nil || !role.IsRoleModleData() {
		node_game.Infoln(role.GetUserID(), "UseItem fail : role is nil")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}
	node_game.Infof("%s %d Call UseItem id:%d count:%d", role.GetUserID(), role.GetID(), msg.GetItemId(), msg.GetCount())

	item := role.GetRoleItem().GetItem(msg.GetItemId())
	if item == nil {
		node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail : item is nil")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	if item.ItemCount < msg.GetCount() || msg.GetCount() <= 0 {
		node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail : useCount is fail")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	itemDef := table_Item.Table_.IDMap[msg.GetItemId()]
	if itemDef == nil {
		node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail : itemDef is nil")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	if role.GetLev() < itemDef.RequiresLevel {
		node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail : level is fail")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	itemLimit := itemDef.Limit
	//	ItemUseStartTime :=
	//	ItemUseEndTime

	//使用时间限制
	//string转化为时间，layout必须为 "2006-01-02 15:04:05"
	//t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2014-06-15 08:37:18",time.Location)
	//	now := time.Now()
	//	if now.Before(ItemUseStartTime) || now.After(ItemUseEndTime) {
	//		return false
	//	}

	//是否可以使用
	if itemDef.CanUse == false {
		node_game.Infoln(role.GetUserID(), role.GetID(), item.GetItemId(), "UseItem fail CanUse == false")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	//次数限制
	if itemLimit != 0 {
		if item.ItemUseTimes+msg.GetCount() > itemLimit {
			node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail : role ItemUseTimes ", item.ItemUseTimes, "ItemLimit:", itemLimit)
			this.errcode = cs_message.EnumType_ERROR
			this.user.EndTrans(this)
			return
		}
	}

	if !role.GetRoleItem().UseItem(msg.GetItemId(), msg.GetCount()) {
		node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem fail")
		this.errcode = cs_message.EnumType_ERROR
		this.user.EndTrans(this)
		return
	}

	//发送背包变化
	role.OnItemDirty()

	node_game.Infoln(role.GetUserID(), role.GetID(), "UseItem OK")
	this.errcode = cs_message.EnumType_OK
	this.user.EndTrans(this)
}

func (this *transactionUseItem) End() {
	this.resp.Errcode = cs_message.EnumType(this.errcode).Enum()
	this.user.Reply(this.req.GetSeriNo(), this.resp)
}

func (this *transactionUseItem) Timeout() {
	this.resp.Errcode = cs_message.EnumType(cs_message.EnumType_RETRY).Enum()
	this.user.EndTrans(this)
}

func init() {
	user.RegisterTransFunc(&cs_message.UseItemToS{}, func(user *user.User, msg *codecs.Message) transaction.Transaction {
		return &transactionUseItem{
			user: user,
			req:  msg,
		}
	})
}
